package com.jiepos.mpos.pay.quickpay.service.epaypp;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;

import com.epayplusplus.api.EpayppResponse;
import com.jiepos.mpos.common.constant.SystemConstant;
import com.jiepos.mpos.pay.quickpay.service.IQuickPayService;



/**
 * 
* 标题:
* 模块: 融商支付服务类(H5)
* 描 述: <描述>
* 版权: Copyright (c) 2017 江苏杰博实信息技术有限公司
* @author 杨剑武
* @version 1.0
* @since 2017年12月16日
* @history（历次修订内容、修订人、修订时间等）
 */
@SuppressWarnings("rawtypes")
public class EpayppH5BaseService extends EpayppCommonService implements IQuickPayService  {
	private static final Logger _log = LoggerFactory.getLogger(EpayppH5BaseService.class);
	
	@Override
	public Map payOrder(String channelMchntCd, String orderNo, String orderAmt, String mobile, String certNo,
			String userName, String cardNo, String remark, Map dataMap) {
		EpayppResponse response = null;
		Map<String, String> reqMap = new HashMap<String, String>();
		reqMap.put("loc_trace_no", String.valueOf(dataMap.get("loc_trace_no")));
		try {
			// 验证是否为62开头的信用卡
			if (!verificationCardNo(String.valueOf(dataMap.get("act_out_no")))) {
				reqMap.put("rspcode", SystemConstant.RSPCODE_ERROR);
				reqMap.put("rspmsg", EPAYPP_RSPMSG_62);
				return getStandardData(reqMap);
			}
			
			response = epayppTradeCreate(dataMap);
			if (!response.isSuccess()) {
				_log.warn("[{}]会员[{}]交易流水号快捷支付交易创建失败", dataMap.get("custom_no"), dataMap.get("loc_trace_no"));
				getRespCode(reqMap, response);
			} else {
				response = epayppWithoutCardTradePay(dataMap);
				Map<String, String> bodyMap = getRespCode(reqMap, response);
				if (!response.isSuccess()) {
					_log.warn("[{}]会员[{}]交易流水号交易支付请求失败", dataMap.get("custom_no"), dataMap.get("loc_trace_no"));

				} else {
					reqMap.put("rspcode", response.getResultCode());
					reqMap.put("rspmsg", response.getResultCodeMsg());
					reqMap.put("action_url", bodyMap.get("action_url"));
					reqMap.put("html", bodyMap.get("html"));
				}
			}
			return getStandardData(reqMap);
		} catch (Exception e) {
			_log.error("融商支付[{}]会员[{}]发生异常![{}]", dataMap.get("custom_no"), dataMap.get("loc_trace_no"), e);
			return null;
		}
	}
	
	/**
	 * 	
	 * 接口: <模块>
	 * 描 述: <描述>
	 * @param paramMap
	 * @return
	 * @since 2018年1月2日
	 */
	@Override
	public boolean noticeOrder(Map<String, String> paramMap) {
		_log.info("融商收银台异步通知原始数据map=[{}]",paramMap);
		Map<String, String> standardMap = noticeStandard(paramMap);
		boolean flag = false;
		try {
			flag = noticeService.noticeUpdate(standardMap);
		} catch (Exception e) {
			flag = false;
			_log.error("融商收银台异步通知更新发生异常", e);
		}
		return flag;
	}

	
	/**
	 * 	
	 * 接口: <模块>
	 * 描 述: <描述>
	 * @param queryMap
	 * @return
	 * @since 2018年1月2日
	 */
	@Override
	public Map<String, String> queryChannelOrder(Map<String, String> queryMap) {
		_log.info("融商收银台主动查询请求的map[{}]", queryMap);
		try {
			Map<String, Object> repMap = epayppTradeQuery(queryMap);
			
			return queryStandard(repMap,queryMap.get("loc_trace_no"));
		}catch (Exception e) {
			_log.error("融商收银台主动查询请求发生异常", e);
			return new HashMap<String, String>();
		}
	}

		
	@Override
	public Map<String, String> verifyCode(Map<String, String> reqMap) {
		return null;
	}

	/**
			* @param reqMap
			* @return
			* @throws Exception
			*/
		
	@Override
	public Map<String, String> getStandardData(Map<String, String> reqMap) throws Exception {
		Map<String, String> respMap = new HashMap<String, String>();
		Assert.notNull(reqMap.get("loc_trace_no"));
		Map<String, String> infoMap = appLogTransJnlsPayService.getTranInfo(reqMap.get("loc_trace_no"));
		log.info("融商支付响应报文为:[{}],[{}]交易对应的查询数据为:[{}]",reqMap,reqMap.get("loc_trace_no"),infoMap);
		Map<String, Object> traceTime = mainBusinessService.getSystemTime();
		respMap.put("loc_dt", String.valueOf(traceTime.get("loc_dt")));//交易日期
		respMap.put("loc_ts", String.valueOf(traceTime.get("loc_ts")));//交易日期
		respMap.put("trf_mchnt_cd", infoMap.get("trf_mchnt_cd"));// 商户编号（渠道）
		respMap.put("trf_term_id", infoMap.get("trf_term_id"));// 终端编号（渠道）
		respMap.put("complete_dt", reqMap.get("complete_dt"));// 订单完成日期（渠道）
		respMap.put("complete_ts", reqMap.get("complete_ts"));// 订单完成时间
		respMap.put("custom_no", infoMap.get("custom_no"));// 客户编号（支付系统）
		respMap.put("term_id", reqMap.get("term_id"));// 本地流水号（支付系统)
		respMap.put("trf_trace_no", reqMap.get("trf_trace_no"));// 渠道方流水号（渠道）
		respMap.put("loc_trace_no", reqMap.get("loc_trace_no"));
		respMap.put("trs_stat", reqMap.get("trs_stat"));// 交易状态
		respMap.put("stlst", infoMap.get("stlst"));// 清算状态
		respMap.put("midfee", infoMap.get("midfee"));// 商户手续费
		respMap.put("stl_amt", reqMap.get("stl_amt"));// 结算金额
		respMap.put("rspcode", reqMap.get("rspcode"));// 返回码
		respMap.put("rspmsg", reqMap.get("rspmsg"));// 交易返回信息
		respMap.put("action", reqMap.get("action_url"));// 银联跳转页面
		respMap.put("action_method", reqMap.get("action_method"));// 银联跳转页面
		respMap.put("data", reqMap.get("data"));// 支付数据
		respMap.put("url", reqMap.get("url"));// 未使用
		respMap.put("sourceData", reqMap.get("html"));// 交易返回信息
		respMap.put("channel_type", SystemConstant.CHANNEL_TYPE_H5);
		log.info("融商支付响应响应报文转标准化系统处理报文[{}]",respMap);
		return respMap;
	}


	@Override
	public Map<String, String> queryChannelStlResult(Map<String, String> queryMap) {
		return null;
	}

	@Override
	public Map<String, String> sendVerifyCode(Map<String, String> reqMap) {
		return null;
	}
}
